# -*- coding: utf-8 -*-
"""
@Time    : 2024/6/28 10:36 
@Author  : ZhangShenao 
@File    : inherit.py 
@Desc    : 类的继承
在Python中,所有类的根源都是object类
如果一个类没有指定所继承的类,那么它默认继承object
Python中支持多继承,可以同时拥有多个类的属性和方法
"""


class A:
    """父类"""

    def __init__(self):
        """构造函数"""

        # 初始化父类的属性
        self.apple = 'apple'

    def show(self):
        """定义父类的方法"""
        print(f'i have an {self.apple}')

    def get_apple(self):
        """定义父类的方法"""
        return self.apple


class B(A):
    """子类,继承父类A"""

    def __init__(self):
        """构造函数"""

        # 显式调用父类的构造函数
        # 这样在子类初始化时,就可以同时初始化父类,同时获取父类的属性和方法
        super().__init__()

        # 初始化子类的属性
        self.banana = 'banana'

    def show(self):
        """子类可以覆盖父类的方法"""
        print(f'i have a {self.banana}')

    def who(self):
        """定义子类的方法"""
        print('i am an instance of class B')

    def get_banana(self):
        return self.banana


class C(B):
    """继承链"""
    pass


if __name__ == '__main__':
    # 创建子类对象
    b = B()

    # 子类可以直接访问父类的属性
    print(f'b.apple: {b.apple}')

    # 子类可以直接调用父类的方法
    b.show()

    # 调用子类自己的方法
    b.who()

    # 创建孙子类
    c = C()

    # 孙子类可以访问父类和爷爷类的属性和方法
    print(f'c.apple: {c.apple}')
    c.show()

    # 可以用内置函数issubclass(),来判断一个类是否为另一个类的子类(包括孙子类)
    print(f'issubclass(C,B): {issubclass(C, B)}')  # issubclass(C,B): True
    print(f'issubclass(C,A): {issubclass(C, A)}')  # issubclass(C,A): True
